package cn.wolfcode.realm;

import cn.wolfcode.domain.User;
import cn.wolfcode.domain.User1;
import cn.wolfcode.mapper.DataMapperO;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import java.util.List;

public class UserRealm2 extends AuthorizingRealm {

    // 提供授权（or）信息
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {// 提供认证信息
//        principalCollection.getPrimaryPrincipal() 其实就是在认证的时候放入的SimpleAuthenticationInfo的第一个参数
        User user1 = (User)principalCollection.getPrimaryPrincipal();
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 根据登录用户的名称查询到其拥有的所有角色的编码
        List<String> roleSns = DataMapperO.getRoleByName(user1.getUsername());

        // 将用户拥有的角色添加到授权信息对象，供Shiro权限校验时候使用
        info.addRoles(roleSns);

        // 根据登录用户的名称查询到其拥有的所有权限表达式
        List<String> expressions = DataMapperO.getPermissionByName(user1.getUsername());

        // 将用户拥有的权限添加到授权信息对象中，供shiro权限校验使用
        info.addStringPermissions(expressions);
        return info;
    }

    // 提供认证（en）信息
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 页面传入的账号
        String username = (String)authenticationToken.getPrincipal();
        // 模拟从数据库中查询数据
        User1 user1 = DataMapperO.getUserByName(username);
        if (user1==null) {
            // 账号不存在则返回null
            return null;
        }else{
            // 如果存在需要封装AuthenticationInfo对象放回
            return new SimpleAuthenticationInfo(
                    user1, //身份对象,可以理解为在Web环境中登录成功后需要放入Session中的对象
                    user1.getPassword(), //凭证(密码),需要和传入的凭证(密码)做比对
                    ByteSource.Util.bytes(user1.getSalt()), //返回盐
                    this.getName());
        }
    }
}
